package Array.BinarySearch;//给你一个仅由整数组成的有序数组，其中每个元素都会出现两次，唯有一个数只会出现一次。
//
// 请你找出并返回只出现一次的那个数。 
//
// 你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。 
//
// 
//
// 示例 1: 
//
// 
//输入: nums = [1,1,2,3,3,4,4,8,8]
//输出: 2
// 
//
// 示例 2: 
//
// 
//输入: nums =  [3,3,7,7,10,11,11]
//输出: 10
// 
//
// 
//
// 
//
// 提示: 
//
// 
// 1 <= nums.length <= 10⁵ 
// 0 <= nums[i] <= 10⁵ 
// 
// Related Topics 数组 二分查找 👍 502 👎 0


//leetcode submit region begin(Prohibit modification and deletion)
class singleNonDuplicate {
    public int singleNonDuplicate(int[] nums) {
        int len = nums.length;
        if(len==1){
            return nums[0];
        }

        int left = 0;
        int right = len-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(mid+1 < len && nums[mid] == nums[mid+1]){
                //如果当前值和右边值相同，若mid是偶数的话，出现一次的在右半部分，否则在左半部分
                if(mid%2==0){
                    left = mid+1;
                }else{
                    right = mid-1;
                }
            }else if(mid-1 >= 0 && nums[mid] == nums[mid-1]){
                //如果当前值和左边值相同，若mid是奇数，则出现一次的在左半部分,否则在右半部分
                if(mid%2==1){
                    left = mid+1;
                }else{
                    right = mid-1;
                }
            }else{
                //目标值
                return nums[mid];
            }
        }
        return nums[left];
    }
}
//leetcode submit region end(Prohibit modification and deletion)
